
let rules = {
    len: function (v, v2) {return v.length == v2;},//字符串长度
    minlen: function (v, v2) {return v.length >= v2;},//最小长度
    maxlen: function (v, v2) {return v.length <= v2;},//最大长度
    required: function (v) {return v?(v.replace(/\s+/g, '') ? true : false):false;},//为空判断
    min: function (v, v2) {return v >= v2;},//最小值
    max: function (v, v2) {return v <= v2;},//最大值
    idCard: function (v) {return (/^\d{17}[\d|x|X]$|^\d{15}$/).test(v);},//身份证
    mobile: function (v) {return (/^0?(13|14|15|16|17|18|19)[0-9]{9}$/).test(v);},//手机号码
    int: function (v) {return (/^-?\\d+$/).test(v);},//整数
    number: function (v) {return (/^(-?\d+)(\.\d+)?$/).test(v);},//浮点数
    email: function (v) {return (/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/).test(v);},//电子邮件
    qq: function (v) {return (/[0-9]{5,11}/).test(v);},//QQ号
    url: function (v) {return (/^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/).test(v);},//网址
    chinese: function (v) {return (/^[\u4e00-\u9fa5]{0,}$/).test(v);},//纯中文字符串
    zhen: function (v) {return (/^[A-Za-z0-9]+$/).test(v);},//中英文字符串
    zh_en: function (v) {return (/^\w+$/).test(v);},//中英文下划线
    en: function (v) {return (/^[A-Za-z]+$/).test(v);},//英文字符串
}

let msg = {
    required: '不能为空',
    minlen: "长度不足{s}",
    maxlen: "长度超过{s}",
    len: "长度不相等",
    min: "不能小于{s}",
    max: "不能大于{s}",
    idCard: '身份证格式不正确',
    mobile: '手机号码格式不正确',
    int: '不是整数',
    number: '不是数字',
    email: '邮箱格式不正确',
    qq: '不是QQ号',
    url: '网址格式不正确',
    chinese: '只能是汉字',
    zhen: '只能是数字和英文字母组成',
    zh_en: '只能由数字、26个英文字母或者下划线组成',
    en: '只能是英文字符串',
    custom:'未通过验证'
}
let verifydata={};

//验证
function verify(rule) {

    /*
    * rule={
    * get{  //get方式字段
    *       字段名:{
    *           检测方法名:[比较值,错误提示], //错误提示字符串中{s}会替换为比较值(不是待验证值,自定义验证不会替换)
    *           'custom': [验证函数,错误提示]//自定义验证  return false/true
    *       },
    *       ...
    *   },
    *   post{ //post方式字段
    *       字段名:{
    *           检测方法名:[比较值,错误提示], //错误提示字符串中{s}会替换为比较值(不是待验证值,自定义验证不会替换)
    *           'custom': [验证函数,错误提示]//自定义验证  return false/true
    *       },
    *       ...
    *   }
    * }
    * */

    let error = [], ispass;
    for(var b in verifydata) {
        for (let i in rule[b]) {
            let currentVerify=rule[b][i];//规则对象
            if (!verifydata[b][i] && !currentVerify.required) continue;
            for (let a in currentVerify) {
                let currentRule = currentVerify[a];
                if (a == 'custom') {
                    ispass = currentRule[0](verifydata[b][i]);//自定义验证
                } else {
                    ispass = rules[a](verifydata[b][i], currentRule[0]);
                }
                if (ispass!=true) {
                    let defalutmsg = msg[a].replace('{s}', currentRule[0]);
                    if(a!='custom'){
                        error.push(i + ":" + (currentRule[1] ? currentRule[1] .replace('{s}', currentRule[0]): defalutmsg)+"("+b+")");
                    }else{
                        error.push(i + ":" + (currentRule[1] ? currentRule[1]: defalutmsg)+"("+b+")");
                    }
                }
            }
        }
    }
    if (error.length != 0) {
        return error; //未通过验证
    }
    return true;
}



module.exports= function (rules){

    verifydata.post=this.POST?this.POST:{};
    verifydata.get=this.GET?this.GET:{};

    let res= verify(rules);
    if(res!=true){
        return res;
    }else{
        return true
    }
}





